package ar.edu.caece.compiler.grammar.attributes.tree;



public class NodeOperacion extends NodeExpr {

	private Type tipoOperacion;
	private Operacion operacion;
	private NodeExpr operando1;
	private NodeExpr operando2;
	
	public NodeOperacion(Type tipoOperacion, Operacion operacion,
			NodeExpr operando1, NodeExpr operando2) {
		super();
		this.tipoOperacion = tipoOperacion;
		this.operacion = operacion;
		this.operando1 = operando1;
		this.operando2 = operando2;
	}
	
	public Operacion getOperacion() {
		return operacion;
	}
	public void setOperacion(Operacion operacion) {
		this.operacion = operacion;
	}
	
	public Type getTipoOperacion() {
		return tipoOperacion;
	}
	public void setTipoOperacion(Type tipoOperacion) {
		this.tipoOperacion = tipoOperacion;
	}
	public NodeExpr getOperando1() {
		return operando1;
	}
	public void setOperando1(NodeExpr operando1) {
		this.operando1 = operando1;
	}
	public NodeExpr getOperando2() {
		return operando2;
	}
	public void setOperando2(NodeExpr operando2) {
		this.operando2 = operando2;
	}

	@Override
	public String toString() {
		return "NodeOperacion [operacion=" + operacion + ", operando1="
				+ operando1 + ", operando2=" + operando2 + ", tipoOperacion="
				+ tipoOperacion + "]";
	}

	@Override
	public void propagarEntornoSuperior(NodeFuncProc nodeFuncProc) {
		operando1.propagarEntornoSuperior(nodeFuncProc);
		operando2.propagarEntornoSuperior(nodeFuncProc);
	}
	
	@Override
	public void propagateRoot(NodeListaBloques nodeListaBloques) {
		operando1.propagateRoot(nodeListaBloques);
		operando2.propagateRoot(nodeListaBloques);
	}
	
	
	@Override
	public String generateCode() {
		StringBuilder builder = new StringBuilder();
		
		//Coloco primer operando
		builder.append(operando1.generateCode()).append(System.getProperty("line.separator"))
		.append("push cx;param1").append(System.getProperty("line.separator"));
		
		builder.append(operando2.generateCode()).append(System.getProperty("line.separator"))
		.append("push cx;param2").append(System.getProperty("line.separator"));
		
		if(Type.ENTERO.equals(tipoOperacion)) builder.append("call ").append(operacion.getFunctionNameEntero());
		else if(Type.NATURAL.equals(tipoOperacion)) builder.append("call ").append(operacion.getFunctionNameNatural());
		
		builder.append(System.getProperty("line.separator"))
		.append("pop cx").append(System.getProperty("line.separator"));
		
		return builder.toString();
	}
}
